package org.jederik.studip.android.view.tools;

import java.util.HashMap;
import java.util.Map;

import org.jederik.studip.android.R;
import org.jederik.android.provider.StudIP;
import org.jederik.android.provider.StudIP.*;

import android.content.Context;
import android.database.Cursor;
import android.view.View;
import android.widget.ImageView;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;

/**
 * Dieser Adapter stellt die einzelnen Listeneinträge der 
 * {@link org.jederik.studip.android.FeedActivity} dar.
 * @author jederik
 *
 */
public class FeedAdapter extends ResourceCursorAdapter {
	
	// Hier werden die Icon-Resourcen für bereits gelesene Objekte den 
	// unterschiedlichen Resourcentypen zugewiesen: 
	private static final Map<String, Integer> icons = new HashMap<String, Integer>() {
		{
			put(StudIP.TYPE_NEWS, Integer.valueOf(R.drawable.ic_list_news));
			put(StudIP.TYPE_MESSAGE, Integer.valueOf(R.drawable.ic_list_message));
			put(StudIP.TYPE_SCHEDULE, Integer.valueOf(R.drawable.ic_list_schedule));
		}
	};
	
	// Hier entsprechendes für ungeöffnete Objekte:
	private static final Map<String, Integer> unreadIcons = new HashMap<String, Integer>() {
		{
			put(StudIP.TYPE_NEWS, Integer.valueOf(R.drawable.ic_list_news_unread));
			put(StudIP.TYPE_MESSAGE, Integer.valueOf(R.drawable.ic_list_message_unread));
			put(StudIP.TYPE_SCHEDULE, Integer.valueOf(R.drawable.ic_list_schedule_unread));
		}
	};

	private final int TYPE_INDEX, READ_INDEX, TITLE_INDEX, DESCRIPTION_INDEX, DATE_INDEX;
	
	public FeedAdapter(Context context, Cursor cursor) {
		super(context, R.layout.feed_entry, cursor, true);
	
		// Die Indizes der verschiedenen Tabellenspalten ermitteln:
		TYPE_INDEX = cursor.getColumnIndex(Feed.OBJECT_TYPE);
		READ_INDEX = cursor.getColumnIndex(Feed.READ);
		TITLE_INDEX = cursor.getColumnIndex(Feed.TITLE);
		DESCRIPTION_INDEX = cursor.getColumnIndex(Feed.DESCRIPTION);
		DATE_INDEX = cursor.getColumnIndex(Feed.DATE);

	}
	
	private static class ViewHolder {
		ImageView icon;
		TextView title;
		TextView subtitle;
		TextView date;
	}

	@Override
	public void bindView(View view, Context context, Cursor cursor) {

		// Aus Performanzgründen werden Views von ListView wiederverwendet.
		// Um schnellen Zugriff auf die Anzeigeelemente zu haben, werden diese
		// dem View in einem ViewHolder-Objekt als Tag angehängt:
		ViewHolder holder;
		if ((holder = (ViewHolder) view.getTag()) == null) {
			
			holder = new ViewHolder();
			
			holder.icon = (ImageView) view.findViewById(R.id.icon);
			holder.title = (TextView) view.findViewById(R.id.title);
			holder.subtitle = (TextView) view.findViewById(R.id.description);
			holder.date = (TextView) view.findViewById(R.id.date);
			
			view.setTag(holder);
			
		}
		
		// Typ der Resource auf die sich die Änderung bezieht ermitteln:
		String type = cursor.getString(TYPE_INDEX);

		// Ermitteln ob die Resource bereits betrachtet wurde:
		boolean read = cursor.getString(READ_INDEX).equals("1");
		
		// Und entsprechendes Icon einsetzen:
		if (read) {
			if(icons.containsKey(type)) {
				holder.icon.setImageResource(icons.get(type));
			} else {
				holder.icon.setImageResource(R.drawable.ic_default);
			}
		} else {
			if (unreadIcons.containsKey(type)) {
				holder.icon.setImageResource(unreadIcons.get(type));
			} else {
				holder.icon.setImageResource(R.drawable.ic_default_unread);
			}
		}

		// Titel in Titelzeile einsetzen:
		holder.title.setText(cursor.getString(TITLE_INDEX));
		
		// Beschreibung in Beschreibungszeile einsetzen:
		holder.subtitle.setText(cursor.getString(DESCRIPTION_INDEX));
		
		// Formatiertes Datum in Datumszeile einsetzen:
		String timestamp = cursor.getString(DATE_INDEX);
		holder.date.setText(FormatHelper.formatDate(Integer.parseInt(timestamp)));

	}

}
